//
//  内存管理.h
//  面试题
//
//  Created by Toj on 8/13/21.
//

#pragma mark - 问题
1. 有哪些会造成内存泄露
2. 有什么办法检测内存泄露
3. 野指针错误
3.1 https://blog.csdn.net/tencent_bugly/article/details/46277055


#pragma mark - 有哪些会造成内存泄露
1. 循环引用
1.1. block
1.2. delegate
1.3. NSTimer
2. C++/ C 函数开辟的内存, 不用的时候没有及时Release
3. C函数申请内存malloc, 没有free


#pragma mark - 循环引用的检测
1. 静态分析, xcode 自带的静态分析工具 analyze
2. 利用析构方法检测, 这样可能能检测的细一点, 但是很慢
3. instrument -> leaks, 可能一些内存泄露无法定位到指定的代码段
建议 1 & 2 & 3 一起用
leaks 使用的一些 操作/ 筛选
Separate by Thread: 按线程分开做分析, 这样更容易揪出那些吃资源的问题线程.
特别是对于主线程, 它要处理和渲染所有的接口数据, 一旦受到阻塞, 程序必然卡顿或停止响应.
Invert Call Tree: 反向输出调用树.
把调用层级最深的方法显示在最上面, 更容易找到最耗时的操作.
Hide System Libraries: 隐藏系统库文件.
过滤掉各种系统调用, 只显示自己的代码调用.
Flattern Recursion: 拼合递归.
将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条.
4. Debug Memory Graph
清晰看到每个对象的引用情况, 如果有循环引用会出现黄色警告/ 红色错误提示
5. 第三方工具库
5.1. PLeakSniffer
5.2. MLeaksFinder

#pragma mark - 野指针错误
1. 对象未初始化赋值, 直接使用
2. 对象修饰用assign, 最后对象被释放后没有辅助nil
3. 多个线程同时操作1块内存

#pragma mark - 野指针定位检测
1. Zoombie Object without Xcode
xcode 自带的检测方法
2. Instrument 内zombie 工具
